package cn.wolfcode.service;


import cn.wolfcode.domain.OrderInfo;
import cn.wolfcode.domain.PayResult;
import cn.wolfcode.domain.SeckillProductVo;
import cn.wolfcode.mq.OrderMessage;

/**
 * Created by wolfcode
 */
public interface IOrderInfoService {

    /**
     * 根据用户ID和秒杀ID以及秒杀场次查询订单信息
     *
     * @param phone
     * @param seckillId
     * @param time
     * @return
     */
    OrderInfo selectByUserIdAndSeckillId(Long phone, Long seckillId, Integer time);

    /**
     * 扣除库存，并创建订单，返回订单对象
     *
     * @param phone 手机号即用户ID
     * @param sp    秒杀商品对象
     * @return
     */
    OrderInfo doSeckill(Long phone, SeckillProductVo sp);

    /**
     * 扣除库存，并创建订单，返回订单对象
     *
     * @param phone 手机号即用户ID
     * @param sp    秒杀商品对象
     * @return
     */
    OrderInfo doSeckill(Long phone, Integer time, Long seckillId);

    /**
     * 根据订单编号查询订单信息
     *
     * @param orderNo 订单编号
     * @return 订单信息
     */
    OrderInfo findByOrderNo(String orderNo);

    /**
     * 回补Redis中的库存数量，删除Redis中用户是否已经下单标识，删除本地标识库存已经售完的标记
     *
     * @param orderMessage 订单消息对象
     */
    void orderCreateFailedRollback(OrderMessage orderMessage);

    /**
     * 检查订单超时未支付，自动取消订单 即 回滚操作
     *
     * @param orderMessage 订单消息对象
     */
    void checkOrderPayTimeout(OrderMessage orderMessage);

    /**
     * 在线支付
     *
     * @param orderNo 订单编号
     * @return String 跳转支付页面的URL
     */
    String onlinePay(String orderNo, Long phone);

    /**
     * 支付成功修改订单状态以及记录支付流水
     *
     * @param payLog 支付日志对象
     */
    void changeOrderStateAndPayLog(PayResult payResult);

    /**
     * 申请退款
     *
     * @param orderNo 订单编号
     */
    void refundByAlipay(String orderNo);

    /**
     * 积分支付
     *
     * @param orderNo
     */
    void integralPay(String orderNo, Long phone);

    /**
     * 积分退款回调
     */
    void integralRefundRollback(String orderNo);

}
